1. 변수와 메서드
변수의 종류
변수의 종류는 선언된 위치를 잘 확인해야 한다. 크게 클래스 영역, 메서드 영억으로 나누어지며 클래스 영역에서는 변수 앞에 static이 붙었는가에 따라 구분하고 나머지는 다 지역(local) 변수이다.
➡️ 인스턴스 변수
클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다. 그렇기 때문에 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다.
➡️ 클래스 변수
클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static을 붙이기만 하면 된다. 인스턴스 변수와는 달리 클래스 변수는 모든 인스턴스 변수가 공통된 저장공간(변수) 를 공유하게 된다. 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스 변수로 선언해야한다.
➡️ 지역변수
메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없게된다.
예시
- 클래스 변수는 다른 인스턴스에서 값을 바꿨음에도 불구하고 값이 전부 바뀌었다.
- 인스턴스 변수는 각각 선언된 객체마다 값이 다르다.
기본형 매개변수, 참조형 매개변수
- 기본형 매개변수
- 변수 a는 change라는 함수를 통과했지만 바뀌지 않았다 왜일까?
➡️ 이유
1) change메서드가 호출되면서 d38.a가 change 매서드 매개변수 x에 복사된다
2) change메서드에서 x의 값을 1000으로 변경
3) change메서드가 종료되면서 매개변수 x는 스택에서 제거됨
- 참조형 매개변수
- 이번에는 변수 a가 값이 1000으로 바뀌었다 왜일까?
➡️ 이유
1) change메서드가 호출되면서 참조변수의 d38 값(주소)가 매개변수 d38에 복사됨
2) change메서드에서 매개변수 d38로 a의 값을 1000으로 변경
3) d38은 메서드가 종료되면서 삭제됨
두 변수의 차이점은 “주소 값 복사 or 그냥 복사” 의 차이라고 볼 수 있다.
- 기본형 매개변수는 “값” 을 복사하고 참조형 매개변수는 “주소 값”을 복사한다.
메서드(Method)
클래스에 종속되어 있는 함수라고 생각하면 된다.
😀 Method 예제를 보자
이처럼 클래스에서 선언해주고 인스턴스를 생성해서 메서드를 사용하면 뭐가 좋을까?
Method를 사용하면 좋은 점
➡️ 높은 재사용성
클래스에 메서드를 선언해두기만 하면 객체를 생성할 때마다 함수를 선언해줄 필요가 없다.
➡️ 중복된 코드의 제거
재 사용성이 높기 때문에 코드가 중복되는 것을 막을 수 있다. 중복된 코드는 코드의 관리가 용이하여 오류가 발생할 확률을 줄일 수 있다.
➡️ 프로그램의 구조화
몇줄 안되는 프로그램에서는 구조라고 할 것 조차 없겠지만 천줄, 만줄, 십만줄이 넘어가는 코드에서는 해당 클래스와 메서드를 잘 정의해두면 요긴하게 쓸 수 있고 클래스와 메서드의 변수명 등에 신경 쓴다면 코드의 구조화에 큰 기여를 할 수 있다.
Method의 구조
항상 메서드에 매개변수를 넣어줄 때는 매개변수가 유효한지 검사해야 한다.
ex) 어떤 수 a를 b로 나누는 프로그램에서 매개변수가 100, 0이 전달될경우 0으로 나눌 수 없기때문에 에러가 발생
- Method 선언 후 구현 초반 부분에 매개변수의 유효성을 검증할만한 조건문을 작성할 수 있다.
2. 참조형 변환타입, 재귀호출
참조형 변환타입
참조형 변환타입이란 객체의 주소를 변환하는 것 이라고 표현할 수 있다.
➡️ 설명
1) copy method가 실행되면서 참조변수 d의 값이 copy의 매개변수 d에 복사된다
2) copy에서 새로운 객체 tmp가 생성된 후 d.a에 저장된 값을 tmp.a에 복사한다
3) copy method가 종료되면서 return으로 tmp의 값을 반환하고 해당 값은 d2에 저장된다.
4) 복사된 주소값으로 d2를 사용할 수 있다. tmp가 d2인 셈이다.
➡️ 참조형 반환타입
- 이처럼 함수에서 인스턴스를 생성한 후 해당 주소값을 반환한다
- 반환된 주소값을 기준으로 인스턴스를 참조할 수 있다.
재귀호출(recursive call)
- 재귀호출이란?
- 재귀호출이란 메서드 내에서 다시 자기 자신을 호출하는 것을 말한다.
- 재귀호출로 가능한 요소
- 펙토리얼( ! )
클래스 메서드(static)와 인스턴스 메서드
선언
클래스 메서드와 인스턴스 메서드의 차이는 클래스 메서드는 객체를 생성하지 않고 호출이 가능하다. 클래스 내에서 static 을 붙이면 클래스 메서드이다.
클래스의 설계와 클래스&인스턴스 메서드의 차이
- 클래스를 설계할 때, 맴버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
클래스 메서드는 인스턴스 변수를 사용할 수 없는 이유?
- 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재한다(언제나 사용 가능하기 때문)
- 하지만 클래스 멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수 있다. (객체를 생성해야 인스턴스 변수가 메모리 상에 상주 하기 때문)
예시